package com.x.xdweb.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Set;

import org.apache.commons.collections.list.TreeList;

public class BeanUtils {

	public static void copyProperties(Object dest, Object orig)
			throws Exception {
		Method[] methods = orig.getClass().getDeclaredMethods();

		List ltCopyTypes = new ArrayList();
		ltCopyTypes.add(String.class);
		ltCopyTypes.add(int.class);
		ltCopyTypes.add(boolean.class);
		ltCopyTypes.add(double.class);
		ltCopyTypes.add(byte.class);
		ltCopyTypes.add(float.class);
		ltCopyTypes.add(long.class);
		ltCopyTypes.add(BigDecimal.class);
		ltCopyTypes.add(BigInteger.class);
		ltCopyTypes.add(Integer.class);
		ltCopyTypes.add(Boolean.class);
		ltCopyTypes.add(Double.class);
		ltCopyTypes.add(Byte.class);
		ltCopyTypes.add(Float.class);
		ltCopyTypes.add(Long.class);
		ltCopyTypes.add(short.class);
		ltCopyTypes.add(Short.class);
		ltCopyTypes.add(java.sql.Date.class);
		ltCopyTypes.add(java.sql.Time.class);
		ltCopyTypes.add(java.sql.Timestamp.class);

		List collectLt = new ArrayList();
		collectLt.add(List.class);
		collectLt.add(ArrayList.class);
		collectLt.add(TreeList.class);
		collectLt.add(Collection.class);
		collectLt.add(Set.class);
		collectLt.add(HashSet.class);
		collectLt.add(Hashtable.class);

		for (int i = 0; i < methods.length; i++) {
			if (methods[i].getName().indexOf("get") == 0
					&& ltCopyTypes.contains(methods[i].getReturnType())) {
				// org.apache.commons.beanutils.BeanUtils.copyProperty(dest,
				// methods[i].getName(), fields[i].get(orig));
				try {
					Method destMethod = dest.getClass().getMethod(
							methods[i].getName().replaceFirst("get", "set"),
							methods[i].getReturnType());
					destMethod.invoke(dest, methods[i].invoke(orig, null));
				} catch (SecurityException e) {
					e.printStackTrace();
				} catch (NoSuchMethodException e) {
					continue;
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
			} else if (methods[i].getName().indexOf("get") == 0
					&& (!ltCopyTypes.contains(methods[i].getReturnType()))) {
				String javaBeanGetterMethodName = methods[i].getName();
				Type[] types = methods[i].getReturnType()
						.getGenericInterfaces();
				boolean flag = true;
				for (int x = 0; x < types.length; x++) {
					if (types[x].toString().contains("Collection")) {
						flag = false;
					}
				}

				if (!flag) {
					continue;
				}

				Method[] destMethods = dest.getClass().getMethods();

				for (int j = 0; j < destMethods.length; j++) {
					if (destMethods[j].getName().indexOf("get") == 0
							&& destMethods[j].getName().equals(
									javaBeanGetterMethodName)) {
						Method destSetterMethod = dest.getClass().getMethod(
								destMethods[j].getName().replaceFirst("get",
										"set"), destMethods[j].getReturnType());
						destSetterMethod.invoke(dest, destMethods[j]
								.getReturnType().newInstance());
					}
				}
			}
		}
	}

	// public static void test(Object dest, Object orig, String javaBeanName)
	// throws IllegalArgumentException, IllegalAccessException,
	// InvocationTargetException
	// {
	// String[] propertyName2 = javaBeanName.split(".");
	//		
	// for(int i = 0; i < propertyName2.length; i++)
	// {
	// Field[] fields = orig.getClass().getDeclaredFields();
	//			
	// List ltCopyTypes = new ArrayList();
	// ltCopyTypes.add(String.class);
	// ltCopyTypes.add(int.class);
	// ltCopyTypes.add(boolean.class);
	// ltCopyTypes.add(double.class);
	// ltCopyTypes.add(byte.class);
	// ltCopyTypes.add(float.class);
	// ltCopyTypes.add(long.class);
	// ltCopyTypes.add(BigDecimal.class);
	// ltCopyTypes.add(BigInteger.class);
	// ltCopyTypes.add(Integer.class);
	// ltCopyTypes.add(Boolean.class);
	// ltCopyTypes.add(Double.class);
	// ltCopyTypes.add(Byte.class);
	// ltCopyTypes.add(Float.class);
	// ltCopyTypes.add(Long.class);
	// ltCopyTypes.add(short.class);
	// ltCopyTypes.add(Short.class);
	// ltCopyTypes.add(java.sql.Date.class);
	// ltCopyTypes.add(java.sql.Time.class);
	// ltCopyTypes.add(java.sql.Timestamp.class);
	//			
	//			
	// for(int j = 0; j < fields.length; j++)
	// {
	// System.out.println(fields[j].getName() + " ------- " +
	// fields[j].getDeclaringClass());
	// System.out.println(fields[j].getName() + " ------- " +
	// fields[j].getType());
	// fields[j].setAccessible(true);
	// if(ltCopyTypes.contains(fields[j].getType()))
	// {
	// try {
	// Field destField = dest.getClass().getDeclaredField(fields[j].getName());
	// destField.setAccessible(true);
	// org.apache.commons.beanutils.BeanUtils.copyProperty(dest,
	// fields[j].getName(), fields[j].get(orig));
	//						
	// for(int i = 0; i < "sdf".length(); i++)
	// {
	// test()
	// }
	//						
	// } catch (SecurityException e) {
	// throw e;
	// } catch (NoSuchFieldException e) {
	// continue;
	// }
	// }
	// }
	// }
	// }
	//	
	//	
	// public static void copyProperties(Object dest, Object orig, String
	// javaBeanName) throws NoSuchFieldException, IllegalAccessException,
	// InvocationTargetException
	// {
	// ApacheBeanUtils.copyProperties(dest, orig);
	// String[] propertyName2 = javaBeanName.split(".");
	//		
	// for(int i = 0; i < propertyName2.length; i++)
	// {
	// ApacheBeanUtils.copyProperties(dest.getClass().getDeclaredField(name),
	// orig);
	// }
	// }
}
